|
ARD2
RC2
Airbag Reference Demonstrator using MPC5604P
|
00001 00016 #include "derivative.h" 00017 #include "CRC.h" 00018 #include "EDMA.h" 00019 /* 00020 ****************************************************************************** 00021 * Constants 00022 ****************************************************************************** 00023 */ 00024 static const uint8_t cau8CRCConfigs[] = 00025 { 00026 /* CRC32 has been tested and validated */ 00027 /* CRC_CCITT hasn't */ 00028 (CRC_INSTANCE_0_MASK | CRC_CCITT | CRC_NO_MSB_SWAP | CRC_NO_RESULT_INV), 00029 (CRC_INSTANCE_1_MASK | CRC_CCITT | CRC_NO_MSB_SWAP | CRC_NO_RESULT_INV), 00030 (CRC_INSTANCE_0_MASK | CRC_32 | CRC_MSB_SWAP | CRC_RESULT_INV), 00031 (CRC_INSTANCE_1_MASK | CRC_32 | CRC_MSB_SWAP | CRC_RESULT_INV) }; 00032 /* 00033 ****************************************************************************** 00034 * Globals 00035 ****************************************************************************** 00036 */ 00038 static vuint32_t* gpau32CRCResults[2u]; 00039 /* 00040 ****************************************************************************** 00041 * vfnInitCRC 00042 ****************************************************************************** 00043 */ 00044 void vfnInitCRC(uint8_t u8Instance, uint32_t u32Remainder) 00045 { 00046 /* Purpose of this fn is ensure that we have nothing going on in a given */ 00047 /* instance */ 00048 /* Limit the number of instances to the possible HW combinations. In this */ 00049 /* case, this means two. */ 00050 u8Instance = (u8Instance > CLEAR); 00051 00052 /* Make sure that the global pointer to the result is empty */ 00053 gpau32CRCResults[u8Instance] = (uint32_t*)CLEAR; 00054 00055 /* Make sure that the instance contains no data */ 00056 CRC.CNTX[u8Instance].CRC_INP.W = CLEAR; 00057 CRC.CNTX[u8Instance].CRC_CSTAT.W = u32Remainder; 00058 00059 return; 00060 } 00061 /* 00062 ****************************************************************************** 00063 * u8fnCRC 00064 ****************************************************************************** 00065 */ 00066 uint8_t u8fnCRC(const uint8_t* pu8StartAddress, 00067 const uint32_t u32NOfBytes, 00068 uint32_t* pu32Result, 00069 const uint32_t u32Remainder, 00070 const uint8_t u8DMAChannel, 00071 const uint8_t u8CRCConfig) 00072 { 00073 uint8_t u8Status; 00074 CRCConfig_t tCRCConfig; 00075 00076 u8Status = u8fnDMAPending(u8DMAChannel); 00077 tCRCConfig = *(CRCConfig_t*)&(cau8CRCConfigs[u8CRCConfig]); 00078 00079 if(CLEAR == u8Status) 00080 { 00081 /* Reset CRC channel */ 00082 vfnInitCRC(tCRCConfig.P.Instance, u32Remainder); 00083 00084 /* Configure a DMA channel for this operation */ 00085 vfnCRCConfigDMA(pu8StartAddress, u32NOfBytes, u8DMAChannel, tCRCConfig); 00086 00087 /* Configure CRC. */ 00088 vfnCRCConfig(*(CRCConfig_t*)&(cau8CRCConfigs[u8CRCConfig])); 00089 00090 /* Remember pointer */ 00091 gpau32CRCResults[tCRCConfig.P.Instance] = pu32Result; 00092 00093 /* Start */ 00094 vfnDMAStart(u8DMAChannel); 00095 } 00096 else 00097 { 00098 /* Return status */ 00099 } 00100 return; 00101 } 00102 /* 00103 ****************************************************************************** 00104 * vfnCRCConfig 00105 ****************************************************************************** 00106 */ 00107 static void vfnCRCConfig(CRCConfig_t tConfig) 00108 { 00109 CRC.CNTX[tConfig.P.Instance].CRC_CFG.W = (uint32_t)(tConfig.A & 0x0Fu); 00110 00111 return; 00112 } 00113 /* 00114 ****************************************************************************** 00115 * vfnCRCConfigDMA 00116 ****************************************************************************** 00117 */ 00118 static void vfnCRCConfigDMA(const uint8_t* pu8StartAddress, 00119 const uint32_t u32NOfBytes, 00120 const uint8_t u8DMAChannel, 00121 const CRCConfig_t tCRCConfig) 00122 { 00123 00124 TCD_t tMyDefaultConfig; 00125 00126 00127 /* Source address is the start address for our CRC */ 00128 tMyDefaultConfig.P.SADDR = (uint32_t)pu8StartAddress; 00129 /* Destination address is our CRC module input */ 00130 tMyDefaultConfig.P.DADDR 00131 = (uint32_t)(&(CRC.CNTX[tCRCConfig.P.Instance].CRC_INP.B)); 00132 /* Modulus is 0 */ 00133 tMyDefaultConfig.P.SMOD = CLEAR; 00134 tMyDefaultConfig.P.DMOD = CLEAR; 00135 /* We will transfer 32-bit words */ 00136 tMyDefaultConfig.P.SSIZE = DMA_SIZE_8_BIT; 00137 tMyDefaultConfig.P.DSIZE = DMA_SIZE_8_BIT; 00138 tMyDefaultConfig.P.SOFF = 1u; /* Offset per minor loop (in bytes) */ 00139 tMyDefaultConfig.P.DOFF = 0u; /* Destination offset per minor loop */ 00140 tMyDefaultConfig.P.NBYTES = u32NOfBytes; /* Inner loop transfer count (in bytes) */ 00141 tMyDefaultConfig.P.SLAST = CLEAR; 00142 tMyDefaultConfig.P.CITERE_LINK = CLEAR; 00143 tMyDefaultConfig.P.BITERE_LINK = CLEAR; 00144 tMyDefaultConfig.P.CITER = 1u; /* Times we will execute the major loop */ 00145 tMyDefaultConfig.P.BITER = 1u; /* Memory for the loop */ 00146 tMyDefaultConfig.P.D_REQ = TRUE; /* Clear HW Start requests after major loop is done */ 00147 00148 tMyDefaultConfig.P.DLAST_SGA = CLEAR; /* Last destination offset */ 00149 tMyDefaultConfig.P.MAJORLINKCH = CLEAR; 00150 tMyDefaultConfig.P.BWC = DMA_BWC_4_CYCLE_STALL; 00151 tMyDefaultConfig.P.MAJORE_LINK = CLEAR; /* Disable ch2ch linking */ 00152 tMyDefaultConfig.P.E_SG = CLEAR; 00153 00154 tMyDefaultConfig.P.INT_HALF = CLEAR; 00155 tMyDefaultConfig.P.INT_MAJ = TRUE; 00156 tMyDefaultConfig.P.START = CLEAR; 00157 00158 vfnDMAConfig(&tMyDefaultConfig, u8DMAChannel); 00159 00160 return; 00161 } 00162 /* 00163 ****************************************************************************** 00164 * vfnCRCIsr 00165 ****************************************************************************** 00166 */ 00167 static void vfnCRCIsr(uint8_t u8Instance) 00168 { 00169 *gpau32CRCResults[u8Instance] = CRC.CNTX[u8Instance].CRC_OUTP.W; 00170 00171 return; 00172 } 00173 /* 00174 ****************************************************************************** 00175 * vfnCRC0Isr 00176 ****************************************************************************** 00177 */ 00178 void vfnCRC0Isr(void) 00179 { 00180 DMA_CLEAR_ISR_FLAG(CRC_DMA_CH_0); 00181 EDMA.TCD[CRC_DMA_CH_1].DONE = TRUE; 00182 vfnCRCIsr(CRC_INSTANCE_0); 00183 00184 return; 00185 } 00186 /* 00187 ****************************************************************************** 00188 * vfnCRC1Isr 00189 ****************************************************************************** 00190 */ 00191 void vfnCRC1Isr(void) 00192 { 00193 DMA_CLEAR_ISR_FLAG(CRC_DMA_CH_1); 00194 EDMA.TCD[CRC_DMA_CH_1].DONE = CLEAR; 00195 vfnCRCIsr(CRC_INSTANCE_1); 00196 00197 return; 00198 } 00199 /* 00200 ****************************************************************************** 00201 * 00202 * End of file. 00203 * 00204 ****************************************************************************** 00205 */